<?php

/**
 * 分类管理模型
 */
class CategoryModel extends Model{
	//定义表名
	public $table="sn_category";
	//验证规则，供model.class.php中create()方法调用
	//验证规则-,字段名，不为空，2必须验证,3不为空
	public $validate=array(
		array('cname','nonull','分类名称不能为空',2,3),
		array('cname','maxlen:20','分类名称不能超过20个字符',2,3),
		array('csort','num:1,65535','排序字段必须为数字',2,3),
		//表单为空的时候不用验证，
		//验证规则-,字段名，不为空，3不为空时,3不为空
		array('ckeywords','minlen:10','分类关键字不能少于10个字符',3,3),

	);

		
	/**
	 * 获得所有分类数据
	 */
	public function get_all_data($where=null){
		//查询获得按照排序字段升序，所有分类信息数据
		$data=$this->order('csort ASC')->where($where)->all();
		// p($data);
		//把类型名称查出来压入数组
		foreach ($data as $k => $v) {
			$type=K('Type')->where(array('type_id'=>$v['type_id']))->find();
			$data[$k]['type_name']=$type['type_name'];
		}
		// p($data);
		//格式化树状的数据,
		//在模板页面中只有调用此[_name]，才能显示树状结构
		$data=Data::tree($data,'cname','cid','pid');
//		 P($data);die;
		//翻出查询并排列之后的结果
		return $data;
	}
	/**
	 * 获得所有分类类型
	 * 
	 */
	public function get_all_type($where=null){
		$data=K('Type')->where($where)->all();
		return $data;
	}
	/**
	 * 获得一条数据
	 */
	public function get_one_data($where=NULL,$field=NULL){

		return $this->where($where)->field($field)->find();
	}
	/**
	 * 添加分类
	 */
	public function add_data(){
		//执行自动验证，如果不通过，返回假
		//执行自动验证，必须使用create()
		if(!$this->create()) return false;
		//分类名称不能重复,接收处理post提交数据
		$cname=Q('post.cname');
		//查询表，条件为提交的字段，判断是否有相同的
		// if ($this->get_one_data(array('cname'=>$cname))) {
		// 	//压入错误信息
		// 	$this->error=$cname.'分类已经存在';
		// 	return false;
		// }
		//反出，执行插入insert结果
		return $this->add();
	}

	/**
	 * 获得所有子集
	 */
	public function get_son_data($cid){
		//查询到所有分类供循环对比传进来的cid,找到其子集
		$data=$this->all();
		//递归，循环出所有子分类
		return $this->get_son($data,$cid);

	}
	/**
	 * 递归获得所有子集分类，cid是主线
	 */
	public function get_son($data,$cid){

		//保存子分类数组
		$temp=array();
		//循环遍历所有分类
		foreach ($data as $v) {
			//如果pid等于传入的cid,那么就是我想要的，
			//把他压入数组
			if ($v['pid']==$cid) {
				$temp[]=$v['cid'];
				//递归循环所有子分类，合并赋值到数组
				$temp=array_merge($temp,$this->get_son($data,$v['cid']));
			}
		}
		// p($temp);
		
		return $temp;
	}
	

	/**
	 * 获得可以更换选择的父级分类(排除自己和自己子集)
	 */

	public function get_other_data($cid){
		//获得所有子集
		$son=$this->get_son_data($cid);

		//把本身cid也压入数组
		$son[]=$cid;
		//获得除了自己和自己子集的所有数据
		//'SLEECT * FROM hd_category WHERE cid not in (8,11)'
		$data = $this->get_all_data('cid not in(' . implode(',', $son) . ')');
		// $data = $this->get_all_data();
		// p($this->getLastSql());die;
		return $data;

	}

	/**
	 * 编辑分类
	 */
	public function edit_data($where=NULL){
		//执行自动验证
		if (!$this->create()) return false;
		
		//通过验证执行更新语句,反出,注意where 条件写法，加花括号出错
		// $cid=Q('get.cid');
		// $pid=Q('post.pid');
		// $data=$this->get_son_data($cid);
		//判断移动到的分类如果是本身或者自己的子类的话，反出错误
		//如果是本身
		// if ($cid==$pid ) {
		// 	$this->error='不能移动到此自己下面';
		// 	return false;
		// }
		// // p($data);die;
		// //判断移动到的分类如果是自己的子类的话，反出错误
		// foreach ($data as  $v) {
		// 	if ($pid==$v) {
		// 		$this->error='不能移动到自己的子类';
		// 		return false;
		// 	}
		// }
		
		//更新语句
		return $this->where($where)->update();
	}

	/**
	 * 删除分类
	 */
	public function del_data($cid){

		// p($this->where('pid=' . $cid)->find());die;
		
		if($this->where(array('pid'=>$cid))->find()) {
			$this->error='请先删除子分类';
			return false;
		}
		
		//执行删除语句,反出,注意where 条件写法，加花括号出错
		//return $this->where(array('cid'=>$cid))->del();
		return $this->where('cid=' . $cid)->del();
	}

	/**
	* 递归找到所有的父级
	*/
    public function get_father($cate,$pid){
        $temp=array();
	
        foreach ($cate as $v) {
             //如果分类的cid=传入的pid
            //那么把他压入到数组
            if($v['cid']==$pid){
                $temp[]=$v;
                //递归并合并，各分级数组
                $temp=array_merge($temp,$this->get_father($cate,$v['pid']));
            }
        }
        //反出所有父级和祖先级数组
        return $temp;
    }

}